package com.gitee.huanminabc.jcommon.reflect;

import java.lang.reflect.AccessibleObject;
import java.security.AccessController;
import java.security.PrivilegedAction;

/**
 * 简要描述
 *
 * @Author: mac
 * @Date: 2025/4/3 13:32
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
public class ReflectUtil {

    //将参数转换为class[]类型, 用于于方法参数调用, 构造调用
    public static Class[] getObjectsToTypes(Object... objects) {
        Class[] classs = new Class[objects.length];
        for (int i = 0; i < objects.length; i++) {
            classs[i] = objects[i].getClass();
        }
        return classs;
    }

    /**
     * 设置可访问对象的可访问权限为 true  这种方式可以绕过访问修饰符的限制 而接调用 setAccessible(true) 在某些情况下会抛出异常
     *
     * @param object 可访问的对象
     * @param <T>    类型
     * @return 返回设置后的对象
     */
    public static <T extends AccessibleObject> T setAccessible(T object) {
        return AccessController.doPrivileged(new SetAccessibleAction<>(object));
    }
    public static   <T extends AccessibleObject> void setAccessible(T... object) {
        for (T t : object) {
            AccessController.doPrivileged(new SetAccessibleAction<>(t));
        }
    }
    public static class SetAccessibleAction<T extends AccessibleObject> implements PrivilegedAction<T> {
        private final T obj;

        public SetAccessibleAction(T obj) {
            this.obj = obj;
        }

        @Override
        public T run() {
            obj.setAccessible(true);
            return obj;
        }

    }
}
